exit() & atexit() [system call]

exit() 시스템콜: 프로세스 종료
#include <stdlib.h>
void exit(int status);
main 함수의 return 0; 과 eixt(0); 의 차이점
    exit(0)함수: 즉시 프로세스를 종료함(exit() 함수 다음에 있는 코드는 실행되지 않음)
    return 0: 단지 main()이라는 함수를 종료함
        단, main()에서 return 시, C언어 실행 파일에 기본으로 포함된 _start() 함수를 호출하게 되고, 해당 함수는 결국 exit() 함수를 호출함

내부적으로 main()의 return 0; 와 exit(0) 호출과 큰 차이가 업다.
exit(0)은 정상종료를 뜻한다.(보통 비정상적 종료에 exit()함수를 우리가 사용한다.)
부모 프로세스는 status&0377(비트연산) 계산 값으로 자식 프로세스 종료 상태 확인한다.
exit(EXIT_SUCCESS); //EXIT_SUCCESS 0
exit(EXIT_FIALURE); //EXIT_FAILURE 1
exit() 시스템콜 주요 동작
- atexit()에 등록된 동작 수행
- 열려있는 모든 입출력 스트림 버퍼 삭제(stdin, stdout, stderr ‘파일 모두 삭제’)
- 프로세스가 오픈한 파일을 모두 종료
- tmpfile()을 통해 생성한 임시 파일 삭제
#include <stdio.h>
FILE *tmpfile(void);
tmpfile()-임시파일을 wb+(쓸수 있는 이진 파일 형태)모드로 오픈가능
atexit()
프로세스가 종료시 실행될 함수를 등록
등록된 함수를 등록된 역순서대로 실행
atexit_test.c
#include <stdlib.h>
#include <stdio.h>
int main(void){
void exithandling(void);
void goodbyemessage(void);
int ret;
ret=atexit(exithandling);
if(ret!=0)perror("Error in atexit\n");
ret=atexit(goodbyemessage);
if(ret!=0)perror("Error in atexit\n");
exit(EXIT_SUCCESS);
}
void exithandling(void){
printf("exit handling\n");
}
void goodbyemessage(void){
printf("see you again\n");
}

celina@ubuntuserver:~/celina/test$ ./atexit_test

see you again

exit handling